//
//  main.c
//  指针与字符串
//
//  Created by szcq on 2021/5/7.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    // 保存字符串
    char str[] = "wcl";
    printf("str = %s\n", str);//wcl
    str[0] = 'm';
    printf("str = %s\n", str);//mcl
    //数组名就是数组的地址, 数组名保存的就是数组的第0个元素的地址,所以我们可以使用指针来保存字符串
    
    //通过指针保存一个字符串, 其实就是保存的字符串第0个元素的地址
    char * str1 = "wcl";
    printf("str1 == %p\n",str1);//0x100003f50

    
//    str1[1] = 'j';//Thread 1: EXC_BAD_ACCESS
    printf("*str1 = %c\n", *str1);//w
    printf("*str1 = %c\n", *(str1 + 1));//c
    printf("*str1 = %c\n", *(str1 + 2));//l
    
    printf("*str1 + 0_p = %p\n", &(*str1));//0x100003f50
    printf("*str1 + 1_p = %p\n", &(*(str1 + 1)));//0x100003f51
    printf("*str1 + 2_p = %p\n", &(*(str1 + 2)));//0x100003f52
    
    printf("sizeof(*str1) = %ld\n", sizeof(*str1));//1
    printf("sizeof(str1) = %ld\n", sizeof(str1));//8
    
    
    char * str2 = "wcl";
    printf("str2 == %p\n",str2);//0x100003f50


    
    // 通过数组保存字符串和通过指针保存字符串的区别
    // 如果通过数组来保存字符串, 那么字符串是一个变量 str  可以修改
    // 如果通过指针来保存字符串, 那么字符串是一个常量 str2 不能修该
    // 数组保存的字符串存储在内存的栈中, 而通过指针保存的字符串存储在常量区
    // 存储在栈中的变量有一个特点, 当作用域结束系统会自动释放该变量
    // 存储在常量区中的值有一个特点, 不会被释放, 而且多个相同的值对应的地址相同
    
    return 0;
}
